补丁和变换

Crossplane Composition 允许进行 “修补和转换 “操作。 通过修补,Composition 可以对 Composition 所定义的资源应用更改。

当用户创建 Composition 时,crossplane 会将 Composition 中的设置传递给关联的复合资源。 补丁可以使用这些设置来更改关联的复合资源或受管资源。

被引用补丁和变换的例子包括

  • 更改外部资源的名称
  • 将 “东 “或 “西 “等通用术语映射到特定的 Providers 位置
  • 为资源字段添加自定义标签或字符串
Note

Crossplane 希望修补和转换操作是简单的修改。 使用 Composition Functions 进行更复杂或程序化的修改。

Composition patch 是更改字段的操作。 Composition transform 是在应用补丁之前修改数值。

创建补丁

补丁是单个资源内的Composition.

补丁 补丁字段包含一个要应用到单个资源的补丁列表。

每个补丁都有一个 类型,它定义了 crossplane 应用何种补丁操作。

根据补丁类型的不同,补丁引用复合资源或 Composition 内部字段的方式也不同,但所有补丁都会引用一个字段路径字段路径.

字段路径 字段路径定义补丁的输入值。 字段路径定义要通过补丁更改的数据。

下面是一个应用于 Composition 中资源的补丁示例。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - name: my-composed-resource
 6      base:
 7        # Removed for brevity
 8      patches:
 9        - type: FromCompositeFieldPath
10          fromFieldPath: spec.field1
11          toFieldPath: metadata.labels["patchLabel"]

选择字段

crossplane 使用JSONPath 选择器的一个子集(称为 “字段选择器”)来选择 Composition 资源或 managed 资源中的字段。

字段选择器可以选择 Composition 资源或托管资源对象中的任何字段,包括 “metadata”、“spec “或 “status “字段。

字段选择符可以是与字段名或数组索引相匹配的字符串,放在括号中。 字段名可以使用”. “字符来选择子元素。

字段选择器示例

下面是一些来自 Composition 资源对象的选择器示例。

| 选择器 | 被选中的元素 | | — | — | | kind | 种类| | metadata.labels['crossplane.io/claim-name'] | | metadata.labelels['crossplane.io/claim-name'] 我的示例claim| | spec.desiredRegion | | spec.desiredRegion. eu-north-1| spec.resourceRefs[0].name | spec.resourceRefs[0].name | `spec.resourceRefs[0].name my-example-claim-978mh-r6z64|

 1$ kubectl get composite -o yaml
 2apiVersion: example.org/v1alpha1
 3kind: xExample
 4metadata:
 5  # Removed for brevity
 6  labels:
 7    crossplane.io/claim-name: my-example-claim
 8    crossplane.io/claim-namespace: default
 9    crossplane.io/composite: my-example-claim-978mh
10spec:
11  desiredRegion: eu-north-1
12  field1: field1-text
13  resourceRefs:
14  - apiVersion: s3.aws.upbound.io/v1beta1
15    kind: Bucket
16    name: my-example-claim-978mh-r6z64
17  - apiVersion: s3.aws.upbound.io/v1beta1
18    kind: Bucket
19    name: my-example-claim-978mh-cnlhj
20  - apiVersion: s3.aws.upbound.io/v1beta1
21    kind: Bucket
22    name: my-example-claim-978mh-rv5nm
23  # Removed for brevity

重复使用补丁

Composition 可以通过 PatchSet 在多个资源上重复使用一个补丁对象。

要创建补丁集,请定义一个补丁集对象。对象.

PatchSet 中的每个补丁都有一个名称和一个补丁.

Note

对于多个补丁集,只需被引用一个补丁集对象。

用一个唯一的名称.

将 PatchSet 应用于带有补丁的资源类型: 补丁集。设置patchSetName设置为的名称。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4spec:
 5  patchSets:
 6  - name: my-patchset
 7    patches:
 8    - type: FromCompositeFieldPath
 9      fromFieldPath: spec.desiredRegion
10      toFieldPath: spec.forProvider.region
11  resources:
12    - name: bucket1
13      base:
14        # Removed for brevity
15      patches:
16        - type: PatchSet
17          patchSetName: my-patchset
18    - name: bucket2
19      base:
20        # Removed for brevity
21      patches:
22        - type: PatchSet
23          patchSetName: my-patchset
Important

补丁集不能包含其他补丁集。

crossplane 会忽略 PatchSet 中的任何 transformspolicies

资源之间的修补

Composition 无法直接在同一 Composition 中的资源之间进行修补。 例如,生成网络资源并将资源名称修补为计算资源。

Important
ToEnvironmentFieldPath](#toenvironmentfieldpath) 补丁无法从 Status 字段读取数据。

资源可以修补到用户定义的状态字段。

然后,资源可以从该状态字段来修补一个字段。

首先,定义一个自定义状态和自定义字段,例如第二个资源

 1kind: CompositeResourceDefinition
 2# Removed for brevity.
 3spec:
 4  # Removed for brevity.
 5  versions:
 6  - name: v1alpha1
 7    schema:
 8      openAPIV3Schema:
 9        type: object
10        properties:
11          spec:
12            # Removed for brevity.
13          status:
14              type: object
15              properties:
16                secondResource:
17                  type: string

在 Composition 内部,带有源数据的资源被引用一个到组合字段路径补丁将数据写入status.secondResource字段。

目标资源被引用为从复合字段路径补丁从 Composition 资源中读取数据status.secondResource字段中的数据,并将其写入名为标签中。的标签。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        # Removed for brevity
 9      patches:
10        - type: ToCompositeFieldPath
11          fromFieldPath: metadata.name
12          toFieldPath: status.secondResource
13    - name: bucket2
14      base:
15        apiVersion: s3.aws.upbound.io/v1beta1
16        kind: Bucket
17        # Removed for brevity
18      patches:
19        - type: FromCompositeFieldPath
20          fromFieldPath: status.secondResource
21          toFieldPath: metadata.labels['secondResource']

描述 Composition 资源以查看资源status.secondResourceValues 值。

 1$ kubectl describe composite
 2Name:         my-example-claim-jp7rx
 3Spec:
 4  # Removed for brevity
 5  Resource Refs:
 6    Name:         my-example-claim-jp7rx-gfg4m
 7    # Removed for brevity
 8    Name:         my-example-claim-jp7rx-fttpj
 9Status:
10  # Removed for brevity
11  Second Resource:         my-example-claim-jp7rx-gfg4m

描述要查看标签的目标托管资源第二个资源.

1$ kubectl describe bucket
2kubectl describe bucket my-example-claim-jp7rx-fttpj
3Name:         my-example-claim-jp7rx-fttpj
4Labels:       crossplane.io/composite=my-example-claim-jp7rx
5              secondResource=my-example-claim-jp7rx-gfg4m

补丁类型

crossplane 支持多种补丁类型,每种类型都被引用不同的数据源,并将补丁应用到不同的位置。

Important

本节介绍应用于 Composition 内部单个资源的补丁。

有关使用 Composition 的 environment.patches 对整个复合资源应用补丁的信息,请阅读 Environment Configurations 文档。

crossplane 修补程序摘要

Patch Type Data Source Data Destination
FromCompositeFieldPath A field in the composite resource. A field in the patched managed resource.
ToCompositeFieldPath A field in the patched managed resource. A field in the composite resource.
CombineFromComposite Multiple fields in the composite resource. A field in the patched managed resource.
CombineToComposite Multiple fields in the patched managed resource. A field in the composite resource.
FromEnvironmentFieldPath Data in the in-memory EnvironmentConfig Environment A field in the patched managed resource.
ToEnvironmentFieldPath A field in the patched managed resource. The in-memory EnvironmentConfig Environment.
CombineFromEnvironment Multiple fields in the in-memory EnvironmentConfig Enviro

Note

以下所有示例都使用了同一套 Composition、CompositeResourceDefinitions、Claims 和 EnvironmentConfigs。 不同示例中只有被引用的补丁有所变化。

所有示例都依赖 upbound Provider-aws-s3 来创建资源。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3metadata:
 4  name: example-composition
 5spec:
 6  compositeTypeRef:
 7    apiVersion: example.org/v1alpha1
 8    kind: xExample
 9  environment:
10    environmentConfigs:
11    - ref:
12        name: example-environment
13  resources:
14    - name: bucket1
15      base:
16        apiVersion: s3.aws.upbound.io/v1beta1
17        kind: Bucket
18        spec:
19          forProvider:
20            region: us-east-2
21    - name: bucket2
22      base:
23        apiVersion: s3.aws.upbound.io/v1beta1
24        kind: Bucket
25        spec:
26          forProvider:
27            region: us-east-2

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: CompositeResourceDefinition
 3metadata:
 4  name: xexamples.example.org
 5spec:
 6  group: example.org
 7  names:
 8    kind: xExample
 9    plural: xexamples
10  claimNames:
11    kind: ExampleClaim
12    plural: exampleclaims
13  versions:
14  - name: v1alpha1
15    served: true
16    referenceable: true
17    schema:
18      openAPIV3Schema:
19        type: object
20        properties:
21          spec:
22            type: object
23            properties:
24              field1:
25                type: string
26              field2:
27                type: string
28              field3: 
29                type: string
30              desiredRegion: 
31                type: string
32              boolField:
33                type: boolean
34              numberField:
35                type: integer
36          status:
37              type: object
38              properties:
39                url:
40                  type: string

 1apiVersion: example.org/v1alpha1
 2kind: ExampleClaim
 3metadata:
 4  name: my-example-claim
 5spec:
 6  field1: "field1-text"
 7  field2: "field2-text"
 8  desiredRegion: "eu-north-1"
 9  boolField: false
10  numberField: 10

 1apiVersion: apiextensions.crossplane.io/v1alpha1
 2kind: EnvironmentConfig
 3metadata:
 4  name: example-environment
 5data:
 6  locations:
 7    us: us-east-2
 8    eu: eu-north-1
 9  key1: value1
10  key2: value2

FromCompositeFieldPath

字段路径补丁获取 Composition 资源中的 Values 并将其应用到托管资源中的字段。

Tip
被引用FromCompositeFieldPath补丁将用户在其 claims 中的选项应用到 managed resource forProvider 设置中。

例如,要被引用的值是desiredRegion值到托管资源的区域.

字段路径 字段路径值是 Composition 资源中的一个字段。

到字段路径 字段路径值是要更改的托管资源中的字段。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: FromCompositeFieldPath
13          fromFieldPath: spec.desiredRegion
14          toFieldPath: spec.forProvider.region

查看托管资源,查看更新后的区域

1$ kubectl describe bucket
2Name:         my-example-claim-qlr68-29nqf
3# Removed for brevity
4Spec:
5  For Provider:
6    Region:  eu-north-1

ToCompositeFieldPath

ToCompositeFieldPath将数据从单个托管资源写入创建它的 Composition 资源。

Tip
被引用 到组合字段路径补丁从 Composition 中的一个托管资源中获取数据,并将其引用到同一 Composition 中的第二个托管资源中。

例如,在 crossplane 创建新的托管资源后,取值为托管区 ID作为标签作为标签应用到 Composition 资源中。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: ToCompositeFieldPath
13          fromFieldPath: status.atProvider.hostedZoneId
14          toFieldPath: metadata.labels['ZoneID']

查看已创建的托管资源,查看托管区域 ID字段。

1$ kubectl describe bucket
2Name:         my-example-claim-p5pxf-5vnp8
3# Removed for brevity
4Status:
5  At Provider:
6    Hosted Zone Id:       Z2O1EMRO9K5GLX
7    # Removed for brevity

接下来查看 Composition 资源,确认补丁应用了标签

1$ kubectl describe composite
2Name:         my-example-claim-p5pxf
3Labels:       ZoneID=Z2O1EMRO9K5GLX
Important
Crossplane 在创建托管资源后,直到下一个对账循环才会将修补程序应用到复合资源。 这就造成了托管资源就绪与应用修补程序之间的延迟。

CombineFromComposite

组合CombineFromComposite补丁从 Composition 资源中获取 Values,将其组合并应用到托管资源。

Tip
被引用CombineFromComposite补丁来创建复杂的字符串(如安全策略),并将其应用到托管资源。

例如,被引用的 claims 值为desiredRegion字段2来生成托管资源的名称

组合CombineFromComposite补丁仅支持组合选项。

变量 变量字段路径值的列表。

唯一支持的策略策略: 字符串.

可选择应用string.fmt来指定如何组合字符串。

到字段路径 字段路径是要应用新字符串的托管资源中的字段。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: CombineFromComposite
13          combine:
14            variables:
15              - fromFieldPath: spec.desiredRegion
16              - fromFieldPath: spec.field2
17            strategy: string
18            string:
19              fmt: "my-resource-%s-%s"
20          toFieldPath: metadata.name

描述受管资源,查看应用的补丁。

1$ kubectl describe bucket
2Name:         my-resource-eu-north-1-field2-text

CombineToComposite

组合组合到复合补丁从托管资源中获取 Values,将其组合并应用于 Composition 资源。

Tip
被引用 CombineToComposite补丁从托管资源中的多个字段创建类似 URL 的单个字段。

例如,被引用的 managed resource名称区域生成自定义url字段。

Important
在 Composition 资源的 Status 字段中写入自定义字段需要先在 CompositeResourceDefinition 中定义自定义字段。

组合组合到composition补丁仅支持组合选项。

变量 变量fromFieldPath要合并的 managed 资源。

唯一支持的策略策略: 字符串.

可选择应用string.fmt来指定如何组合字符串。

到字段路径 字段路径是要应用新字符串的 Composition 资源中的字段。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: CombineToComposite
13          combine:
14            variables:
15              - fromFieldPath: metadata.name
16              - fromFieldPath: spec.forProvider.region
17            strategy: string
18            string:
19              fmt: "https://%s.%s.com"
20          toFieldPath: status.url

查看 Composition 资源以验证应用的补丁。

1$ kubectl describe composite
2Name:         my-example-claim-bjdjw
3API Version:  example.org/v1alpha1
4Kind:         xExample
5# Removed for brevity
6Status:
7  # Removed for brevity
8  URL:                     https://my-example-claim-bjdjw-r6ncd.us-east-2.com

FromEnvironmentFieldPath

Important

EnvironmentConfigs 是 alpha 功能,默认情况下不会启用。

有关使用 EnvironmentConfig 的更多信息,请阅读 EnvironmentConfigs 文档。

从环境字段路径从环境字段路径补丁从内存中的 EnvironmentConfig 环境中获取 Values 并将其应用到托管资源。

Tip
被引用从环境字段路径来应用基于当前环境的自定义托管资源设置。

例如,被引用环境的locations.eu值,并将其应用为区域.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11        patches:
12        - type: FromEnvironmentFieldPath
13          fromFieldPath: locations.eu
14          toFieldPath: spec.forProvider.region

验证托管资源,确认已应用补丁。

1kubectl describe bucket
2Name:         my-example-claim-8vrvc-xx5sr
3Labels:       crossplane.io/claim-name=my-example-claim
4# Removed for brevity
5Spec:
6  For Provider:
7    Region:  eu-north-1
8  # Removed for brevity

ToEnvironmentFieldPath

Important

EnvironmentConfigs 是 alpha 功能,默认情况下不会启用。

有关使用 EnvironmentConfig 的更多信息,请阅读 EnvironmentConfigs 文档。

环境字段路径环境字段路径补丁获取托管资源的 Values 并将其应用到内存中的 EnvironmentConfig 环境。

Tip
被引用ToEnvironmentFieldPath将数据写入任何 FromEnvironmentFieldPath 补丁都能访问的环境。

例如,被引用的区域值,并将其应用为环境的键1.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11        patches:
12        - type: ToEnvironmentFieldPath
13          fromFieldPath: spec.forProvider.region
14          toFieldPath: key1

由于环境是内存中的,因此没有命令来确认补丁是否将值写入了环境。

Important
环境字段路径环境字段路径补丁发生在***创建资源之前。字段路径无法读取 atProviderStatus 字段。

CombineFromEnvironment

Important

EnvironmentConfigs 是 alpha 功能,默认情况下不会启用。

有关使用 EnvironmentConfig 的更多信息,请阅读 EnvironmentConfigs 文档。

从环境组合CombineFromEnvironment补丁结合了来自内存中 EnvironmentConfig 环境的多个 Values,并将其应用于托管资源。

Tip
被引用CombineFromEnvironment补丁来创建复杂的字符串(如安全策略),并将其应用到受管资源。

例如,将环境中的多个字段组合起来,创建一个唯一的Annotations.

从环境组合CombineFromEnvironment补丁仅支持结合选项。

唯一支持的策略策略: 字符串.

变量 变量字段路径值的列表。

可选择应用string.fmt来指定如何组合字符串。

到字段路径 字段路径是要应用新字符串的托管资源中的字段。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: CombineFromEnvironment
13          combine:
14            strategy: string
15            variables:
16            - fromFieldPath: key1
17            - fromFieldPath: key2
18            string: 
19              fmt: "%s-%s"
20          toFieldPath: metadata.annotations[EnvironmentPatch]

描述托管资源,以查看新的Annotations.

1$ kubectl describe bucket
2Name:         my-example-claim-zmxdg-grl6p
3# Removed for brevity
4Annotations:  EnvironmentPatch: value1-value2
5# Removed for brevity

CombineToEnvironment

Important

EnvironmentConfigs 是 alpha 功能,默认情况下不会启用。

有关使用 EnvironmentConfig 的更多信息,请阅读 EnvironmentConfigs 文档。

组合到环境组合到环境补丁结合了来自托管资源的多个 Values,并将它们应用到内存中的 EnvironmentConfig 环境。

Tip
被引用组合环境补丁来创建复杂的字符串,如在其他托管资源中被引用的安全策略。

例如,结合托管资源中的多个字段创建一个唯一字符串,并将其存储在环境的键2值中。

字符串结合了托管资源种类区域.

组合到环境结合到环境补丁仅支持结合选项。

唯一支持的策略策略: 字符串.

变量 变量fromFieldPath值的列表。

可选择应用string.fmt来指定如何组合字符串。

到字段路径 toFieldPath是要写入新字符串的环境键。

Important
环境密钥必须已经存在。 补丁不能创建新的环境密钥。
 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: CombineToEnvironment
13          combine:
14            strategy: string
15            variables:
16            - fromFieldPath: kind
17            - fromFieldPath: spec.forProvider.region
18            string:
19              fmt: "%s.%s"
20          toFieldPath: key2

由于环境是内存中的,因此没有命令来确认补丁是否将值写入了环境。

转换补丁

在应用修补程序时,Crossplane 支持在将数据作为修补程序应用之前对其进行修改。 Crossplane 将此称为 “转换 “操作。

crossplane 变换摘要。

| 转换类型 | 操作 | | — | — | | convert | 将输入数据类型转换为不同类型。 也称为 “铸造”。 | | map | 根据特定输入选择特定输出。 | | match | 根据字符串或正则表达式选择特定输出。 | | math | 对输入应用数学运算。 | | string | 使用 Go string formatting 改变输入字符串。

使用变换字段直接对单个补丁应用变换。

A转换需要一个类型表示要进行的变换操作。

另一个变换字段与类型在本例中与映射.

其他字段取决于被引用的补丁类型。

此示例被引用为类型: 映射转换,输入spec.desiredRegion匹配到我们欧盟并为spec.forProvider.regionValues 的值返回相应的 AWS 区域。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3# Removed for brevity
 4    - name: bucket1
 5      base:
 6        apiVersion: s3.aws.upbound.io/v1beta1
 7        kind: Bucket
 8        spec:
 9          forProvider:
10            region: us-east-2
11      patches:
12        - type: FromCompositeFieldPath
13          fromFieldPath: spec.desiredRegion
14          toFieldPath: spec.forProvider.region
15          transforms:
16            - type: map
17              map:
18                us: us-east-2
19                eu: eu-north-1

转换变换

转换 转换转换类型可将输入数据类型转换为不同的数据类型。

Tip
某些 Provider API 要求字段是字符串,请使用转换类型将布尔或整数字段改为字符串。

A 转换转换需要 toType定义输出数据类型。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.numberField
4    toFieldPath: metadata.label["numberToString"]
5    transforms:
6      - type: convert
7        convert:
8          toType: string

支持的 toType 值:

| toType 值 | 描述 | | – | | – | | bool | 一个 truefalse 的布尔值。

将字符串转换为布尔值

从字符串转换为 bool 时,crossplane 认为字符串值 1, t, T, TRUE, Truetrue 等于布尔值 True

字符串 0fFFALSEFalsefalse 等于布尔值 False

将数字转换为布尔值

Crossplane 认为整数 “1 “和浮点 “1.0 “等于布尔值 “True”。 任何其他整数或浮点值都是 “False”。

将布尔值转换为数字

crossplane 将布尔值 True 转换为整数 1 或 float64 1.0

false “值转换为整数 “0 “或 float64"0.0

将字符串转换为 float64

字符串转换为浮点64crossplane 支持可选的格式: 数量字段。

被引用 格式: 数量可将 “megabyte “的后缀 “M “或 “megabit “的后缀 “Mi “转换为正确的 float64 值。

Note
有关支持的后缀的完整列表,请参阅 Go 语言文档

添加 格式: 数量转换对象,以启用数量后缀支持。

1- type: convert
2  convert:
3   toType: float64
4   format: quantity

将字符串转换为对象

crossplane 可将 JSON 字符串转换为对象。

添加 format: json转换对象中添加 format: json,这是本次转换唯一支持的字符串格式。

1- type: convert
2  convert:
3   toType: object
4   format: json
Tip
这种转换对于修补对象中的键非常有用。

下面的示例为资源添加了一个标记,标记的自定义键:

 1- type: FromCompositeFieldPath
 2      fromFieldPath: spec.clusterName
 3      toFieldPath: spec.forProvider.tags
 4      transforms:
 5      - type: string
 6        string:
 7          type: Format
 8          fmt: '{"kubernetes.io/cluster/%s": "true"}'
 9      - type: convert
10        convert:
11          toType: object
12          format: json

将字符串转换为数组

crossplane 可将 JSON 字符串转换为数组。

添加 format: json转换对象中添加 format: json,这是本次转换唯一支持的字符串格式。

1- type: convert
2  convert:
3   toType: array
4   format: json

地图变换

地图 映射转换类型将输入值映射为输出值。

Tip
地图 地图转换用于将通用的地区名称(如 “美国 “或 “欧盟”)转换为 Providers 特定的地区名称。

地图 地图转换将来自 字段路径中列出的选项进行比较。 中列出的选项进行比较。.

如果crossplane找到了该值,crossplane会将映射值放入 到字段路径.

Note
如果找不到 Values,crossplane 会为补丁抛出错误。

spec.field1是字符串"field1-text "字符串则 crossplane 会被引用字符串firstField作为Annotations.

如果spec.field1是字符串"field2-text "字符串则 crossplane 会被引用字符串secondField作为Annotations.

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.field1
4    toFieldPath: metadata.annotations["myAnnotation"]
5    transforms:
6      - type: map
7        map:
8          "field1-text": "firstField"
9          "field2-text": "secondField"

在本例中,spec.field1 的值为spec.field1的值是field1-text.

1$ kubectl describe composite
2Name:         my-example-claim-twx7n
3Spec:
4  # Removed for brevity
5  field1:         field1-text

应用于托管资源的 Annotations 是firstField.

1$ kubectl describe bucket
2Name:         my-example-claim-twx7n-ndb2f
3Annotations:  crossplane.io/composition-resource-name: bucket1
4              myAnnotation: firstField
5# Removed for brevity.

匹配转换

比赛 匹配变换与 map 变换类似。

比赛 匹配变换增加了对正则表达式和精确字符串的支持,并能在不匹配时提供默认值。

A 匹配对象需要一个模式对象。

模式 模式是一个或多个模式的列表,用于尝试匹配输入值。

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.field1
 4    toFieldPath: metadata.annotations["myAnnotation"]
 5    transforms:
 6      - type: match
 7        match:
 8          patterns:
 9            - type: literal
10              # Removed for brevity
11            - type: regexp
12              # Removed for brevity

匹配 模式可以是类型: 字面匹配精确字符串或类型: regexp来匹配正则表达式。

Note
crossplane 会在第一个模式匹配后停止处理匹配。

匹配精确字符串

被引用的 模式type: literal来匹配精确字符串。

成功匹配后,Crossplane 会提供结果: 到补丁 到字段路径.

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.field1
 4    toFieldPath: metadata.annotations["myAnnotation"]
 5    transforms:
 6      - type: match
 7        match:
 8          patterns:
 9            - type: literal
10              literal: "field1-text"
11              result: "matchedLiteral"

匹配正则表达式

被引用的 模式type: regexp来匹配正则表达式。regexp键,其中包含要匹配的正则表达式的值。

成功匹配后,Crossplane 会提供结果: 到补丁 到字段路径.

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.field1
 4    toFieldPath: metadata.annotations["myAnnotation"]
 5    transforms:
 6      - type: match
 7        match:
 8          patterns:
 9            - type: regexp
10              regexp: '^field1.*'
11              result: "foundField1"

使用默认值

Provider 可以选择提供一个默认值,以便在没有匹配模式时使用。

默认值可以是原始输入值,也可以是已定义的默认值。

被引用fallbackTo: Values来提供默认值。

例如,如果字符串未知字符串不匹配,则 crossplane 会提供ValuesStringNotFound字段路径

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.field1
 4    toFieldPath: metadata.annotations["myAnnotation"]
 5    transforms:
 6      - type: match
 7        match:
 8          patterns:
 9            - type: literal
10              literal: "UnknownString"
11              result: "foundField1"
12          fallbackTo: Value
13          fallbackValue: "StringNotFound"

要使用原始输入作为回退值,请使用fallbackTo: 输入.

crossplane 被引用原来的字段路径输入的到字段路径Values 值。

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.field1
 4    toFieldPath: metadata.annotations["myAnnotation"]
 5    transforms:
 6      - type: match
 7        match:
 8          patterns:
 9            - type: literal
10              literal: "UnknownString"
11              result: "foundField1"
12          fallbackTo: Input

数学变换

被引用 数学转换对输入进行乘法运算,或应用最小值或最大值。

Important
A 数学变换只支持整数输入。
1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.numberField
4    toFieldPath: metadata.annotations["mathAnnotation"]
5    transforms:
6      - type: math
7        math:
8          ...

clampMin

类型 类型: clampMin被引用的最小值,如果输入大于类型: clampMinValues 值。

例如类型: clampMin要求输入大于20.

如果输入低于20,则 crossplane 会被引用钳位最小值作为到字段路径.

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.numberField
4    toFieldPath: metadata.annotations["mathAnnotation"]
5    transforms:
6      - type: math
7        math:
8          type: clampMin
9          clampMin: 20

夹钳Max

类型 类型: clampMax如果输入值大于类型: clampMaxValues 值。

例如类型: clampMax要求输入小于5.

如果输入值高于5,则 crossplane 会被引用钳位最大值作为到字段路径.

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.numberField
4    toFieldPath: metadata.annotations["mathAnnotation"]
5    transforms:
6      - type: math
7        math:
8          type: clampMax
9          clampMax: 5

倍增

类型 类型: 乘法将输入值乘以 乘以Values 的值。

例如类型: 乘法将来自 fromFieldPath的值乘以 2

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.numberField
4    toFieldPath: metadata.annotations["mathAnnotation"]
5    transforms:
6      - type: math
7        math:
8          type: multiply
9          multiply: 2
Note
乘法 值只支持整数。

字符串转换

字符串 字符串转换应用字符串格式化或操作字符串输入。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.field1
4    toFieldPath: metadata.annotations["stringAnnotation"]
5    transforms:
6      - type: string
7        string:
8          type: ...

字符串变换支持以下类型

字符串转换

类型 类型: 转换根据以下转换类型之一转换输入内容:

  • ToUpper - 将字符串改为全部大写字母。
  • ToLower - 将字符串改为全部小写字母。
  • ToBase64 - 从输入创建新的 base64 字符串。
  • FromBase64 - 从 base64 输入创建新的文本字符串。
  • ToJson - 将输入字符串转换为有效的 JSON 格式。
  • ToSha1 - 创建输入字符串的 SHA-1 哈希值。
  • ToSha256 - 创建输入字符串的 SHA-256 哈希值。
  • ToSha512` - 创建输入字符串的 SHA-512 哈希值。
  • ToAdler32 - 创建输入字符串的 Adler32 哈希值。
1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.field1
4    toFieldPath: metadata.annotations["FIELD1-TEXT"]
5    transforms:
6      - type: string
7        string:
8          type: Convert
9          convert: "ToUpper"

字符串格式

类型 类型: 格式Go string formatting 应用于输入。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.field1
4    toFieldPath: metadata.annotations["stringAnnotation"]
5    transforms:
6      - type: string
7        string:
8          type: Format
9          fmt: "the-field-%s"

加入

类型 类型: 连接使用给定的分隔符将输入数组中的所有 Values 连接成字符串。

这种变换只适用于数组输入。

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.parameters.inputList
 4    toFieldPath: spec.targetJoined
 5    transforms:
 6      - type: string
 7        string:
 8          type: Join
 9          join:
10            separator: ","

正则表达式类型

类型 类型: Regexp提取与正则表达式匹配的输入部分。

可被引用为匹配正则表达式捕获组。 默认情况下,crossplane 会匹配整个正则表达式。

 1patches:
 2  - type: FromCompositeFieldPath
 3    fromFieldPath: spec.desiredRegion
 4    toFieldPath: metadata.annotations["euRegion"]
 5    transforms:
 6      - type: string
 7        string:
 8          type: Regexp
 9          regexp:
10            match: '^eu-(.*)-'
11            group: 1

饰边前缀

类型 类型: TrimPrefix移除匹配字符串和前面的所有字符。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.desiredRegion
4    toFieldPath: metadata.annotations["north-1"]
5    transforms:
6      - type: string
7        string:
8          type: TrimPrefix
9          trim: `eu-

后缀

类型 类型: TrimSuffix移除匹配字符串和所有后续字符。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.desiredRegion
4    toFieldPath: metadata.annotations["eu"]
5    transforms:
6      - type: string
7        string:
8          type: TrimSuffix
9          trim: `-north-1'

补丁政策

crossplane 支持两种类型的修补策略:

  • 从字段路径
  • 合并选项

fromFieldPath 策略

在补丁上引用 fromFieldPath: Required 策略要求 fromFieldPath 必须存在于 Composition 资源中。

Tip
如果资源补丁不起作用,应用 fromFieldPath: Required 策略可能会在 Composition 资源中产生错误,从而帮助排除故障。

默认情况下,crossplane 应用 “fromFieldPath: Optional “策略。 如果 “fromFieldPath: Optional “不存在,crossplane 会忽略补丁。

fromFieldPath: Required的情况下,复合资源会产生错误。fromFieldPath不存在,则复合资源会产生错误。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.desiredRegion
4    toFieldPath: metadata.annotations["eu"]
5    policy:
6      fromFieldPath: Required

合并选项

默认情况下,应用补丁时目标数据会被覆盖。 使用合并选项允许补丁在不覆盖数组和对象的情况下合并它们。

被引用数组输入时,使用appendSlice: true将数组数据追加到现有数组的末尾。

被引用对象时,请使用keepMapValues: true来保留现有对象键值。 补丁会更新输入数据和目标数据之间的任何匹配键值。

1patches:
2  - type: FromCompositeFieldPath
3    fromFieldPath: spec.desiredRegion
4    toFieldPath: metadata.annotations["eu"]
5    policy:
6      mergeOptions:
7        appendSlice: true
8        keepMapValues: true